package view;

import memory.spel.R;
import model.Spel;
import model.Tegel;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import controller.Controller;

public class SpelbordView extends Activity {
	
	public GridView gridview;
	public ImageAdapter imageAdapter;
	public Handler handler = new Handler();

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.spel);
		//geef spelbord view aan de controller
		Controller.getInstance().setSpelbordView(this);
		showSpelbord();
	}
	
	/**
	 * Tonen van het spelbord en click listener aanmaken
	 */
	public void showSpelbord() {
		gridview = (GridView) findViewById(R.id.gridview);
		imageAdapter = new ImageAdapter(this);
		gridview.setAdapter(imageAdapter);

		//click listener
		gridview.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				klikListener(position);
			}
		});
	}
	
	/**
	 * Klik listener
	 * @param position
	 */
	private void klikListener(final int position) {
		Tegel tegel = Controller.getInstance().getSpel().getTegel(position);
		
		//klik listener alleen van toepassing voor de gesloten tegels
		if (!tegel.isZichtbaar() && !tegel.isGevonden()) {
			
			//zichtbaar maken van de tegel
			Controller.getInstance().setZichtbaarTegel(position);
			refreshGridView();
			
			//handel de zet door de geklikte tegel te sluiten of open te laten staan
			Controller.getInstance().afhandelZet(position);
			
			//update aantal zetten scherm
			updateAantalZetten(tegel);
			refreshGridView();
			
			//show uitslag dialog
			if (Controller.getInstance().getSpel().getHuidigeSpelSessie().isEindeSpel()) {
				showUitslag();
			}
		}
	}
	
	/**
	 * Refresh de grid view
	 */
	public void refreshGridView() {
		imageAdapter.notifyDataSetChanged();
		gridview.invalidateViews();
	}
	
	/**
	 * Bijwerken van het aantal zetten op het scherm
	 */
	private void updateAantalZetten(Tegel tegel) {
		TextView tekstView = (TextView) findViewById(R.id.aantalZetten);
		int aantalZetten = Controller.getInstance().getSpel().getHuidigeSpelSessie().getAantalZetten();
		tekstView.setText("Aantal zetten: "+aantalZetten);
	}
	
	
	/**
	 * Laten zien van uitslag spel
	 */
	public void showUitslag() {
    	AlertDialog.Builder dialoog = new AlertDialog.Builder(this);
    	dialoog.setTitle("Einde spel");
    	String bericht = "Gefeliciteerd, alle tegels zijn opengedraaid!";
    	dialoog.setMessage(bericht)
		.setCancelable(false)
		.setPositiveButton("OK", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				dialog.cancel();
			}
		});
    	AlertDialog alert = dialoog.create();
    	alert.setTitle("Spel is afgelopen");
    	alert.show();
    }

	/**
	 * Reset aantal zetten tekst
	 */
	public void resetAantalZettenTekst() {
		TextView tekstView = (TextView) findViewById(R.id.aantalZetten);
		tekstView.setText("Aantal zetten: 0");
	}
	
	//******************************************************
	//Options menu
	//
	//******************************************************
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		//instellingen niet tonen
		menu.getItem(2).setVisible(false);
		return true;
	}
	
	public boolean onOptionsItemSelected(MenuItem item) {
		Intent intent = null;
		
		switch(item.getItemId()) {
			case R.id.hoofdMenu:
				intent = new Intent(this, HoofdmenuView.class);
				startActivity(intent);
			break;
			case R.id.nieuwSpel:
				Controller.getInstance().opnieuwSpelen(getApplicationContext());
			break;
			case R.id.instellingen:
				intent = new Intent(this, Preferences.class);
				startActivity(intent);
			break;
			case R.id.help:
				intent = new Intent(this, Help.class);
				startActivity(intent);
			break;
		}
		return true;
	}
	//******************************************************
	
	public void OnResume() {
		super.onResume();

	}
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		setContentView(R.layout.spel);
	}

	/**
	 * Image adapter klasse voor het weergeven van afbeeldingen
	 */
	public class ImageAdapter extends BaseAdapter {
		private Context mContext;

		public ImageAdapter(Context c) {
			mContext = c;
		}

		public int getCount() {
			return Controller.getInstance().getSpel().getTegels().size();
		}

		public Object getItem(int position) {
			return position;
		}

		public long getItemId(int position) {
			return position;
		}

		// create a new ImageView for each item referenced by the Adapter
		public View getView(int position, View convertView, ViewGroup parent) {
			ImageView imageView;
			if (convertView == null) {
				imageView = new ImageView(mContext);
				imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
				imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
				imageView.setPadding(8, 8, 8, 8);
			} else {
				imageView = (ImageView) convertView;
			}

			Spel spel = Controller.getInstance().getSpel(); 
			Tegel tegel = spel.getTegel(position);
			// achterkant tegel laten zien wanneer tegel niet zichtbaar en niet gevonden is
			if (tegel.isZichtbaar() || tegel.isGevonden()) {
				imageView.setImageResource(tegel.getAfbeeldingId());
			} else {
				imageView.setImageResource(R.drawable.backimage);
			}
			return imageView;
		}

	}
}
